#include <iostream>
#define NUM 100 // 无类型，全局有效
#define PI 3.14

// void func()
//{
//     int NUM = 200;  // 错误：与宏冲突（预处理器先替换，导致变量名重复）
//     float PI = 3.1415;  // 同理，冲突
// }

// #define RED 1
// #define GREEN 2
// #define BLUE 3

enum Color
{
    RED,   // 0
    GREEN, // 1
    BLUE   // 2
};

// 不同枚举的同名成员不冲突
// enum Fruit {
//    RED,    // 合法：属于Fruit类型，与Color::RED不冲突
//    APPLE
//};

void printColor(Color c)
{
    // 只能接收Color类型的值，避免传入无效值
}

// int main() {
//     printColor(RED);  // 正确：传递Color::RED
//     // printColor(1);  // 错误：类型不匹配（需显式转换：printColor((Color)1)）
//
//     int *p = NULL;
//     int a = NULL;
//     return 0;
// }

// 函数重载
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }

void print(const std::string &str) { std::cout << "const " << str << std::endl; }
void print(std::string &str) { std::cout << "const " << str << std::endl; }

int main1()
{
    std::cout << add(1, 2) << std::endl;
    std::cout << add(1.1, 2.2) << std::endl;

    print("1234");
    std::string s = "33333";
    print(s);
    return 0;
}

int main2()
{
    double d = 1.2;
    const int &ref = (int)d; // ref引用的其实时强制类型转换之后的临时变量
    std::cout << sizeof(ref) << std::endl;
    std::cout << sizeof(d) << std::endl;
    return 0;
}

class Simple
{
    int a;    // 4 字节
    char b;   // 1 字节
    double c; // 8 字节
};

// template <typename T>
// template <class T>
// template <struct T>
// class test
//{
// private:
//     T _a;
// };
//
// int main()
//{
//     test<int> it;
//     std::cout << sizeof(Simple) << std::endl;
//     return 0;
// }

// #include <iostream>
//
// using namespace std;
// class A
//{
// public:
//     void Print()
//     {
//         cout << "A::Print()" << endl;
//     }
//
// private:
//     int _a;
// };
//
// int main()
//{
//     A *p = nullptr;
//     p->Print();
//     return 0;
// }
//
// #include <iostream>
// using namespace std;
// class A
//{
// public:
//    void Print()
//    {
//        cout << "A::Print()" << endl;
//        cout << _a << endl;
//    }
//
// private:
//    int _a;
//};
// int main()
//{
//    A *p = nullptr;
//    p->Print();
//    return 0;
//}
//

//#include <iostream>
//using namespace std;
//class A
//{
//public:
//    A(int a)
//        : _a1(a), _a2(_a1)
//    {
//    }
//    void Print()
//    {
//        cout << _a1 << " " << _a2 << endl;
//    }
//
//private:
//    int _a2 = 2;
//    int _a1 = 2;
//};
//int main()
//{
//    A aa(1);
//    aa.Print();
//}


class A
{
public:
    A(int a):_a(a) { std::cout << "A()" << std::endl; }
    A(const A &a) :_a(a._a) { std::cout << "A(const A&)" << std::endl; }
private:
    int _a;
};

void f(A a) {}
void f2(A &a) {}
A f3() { A a(1); return a; }

int main()
{
    // 传值传参
    //A a(1);
    //f(a);

    // 引用传参
    A a(1);
    f2(a);
    //f2(1);
    //f2(A(1));

    // 传值返回
    //f3();
    //A a = f3();

    int *pi = new int;
    free(pi);

    return 0;
}